package com.zsy.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.zsy.mapper.EmpExprMapper;
import com.zsy.mapper.EmpMapper;
import com.zsy.pojo.*;
import com.zsy.service.EmpService;
import com.zsy.utils.JwtUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;


import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author: zhengsuyang
 * @Desc:
 * @create: 2025-09-10 16:50
 **/
@Service
public class EmpServiceImpl implements EmpService {

    @Autowired
    private EmpMapper empMapper;
    @Autowired
    private EmpExprMapper empExprMapper;

    /**
     * 分页 + 条件查询
     *
     * @param empQueryParam
     * @return
     */
    @Override
    public PageResult<Emp> queryPageEmp(EmpQueryParam empQueryParam) {
        // 1.设置分页
        PageHelper.startPage(empQueryParam.getPage(), empQueryParam.getPageSize());
        // 2.执行查询
        List<Emp> empList = empMapper.queryPageEmp(empQueryParam);
        // 3.封装查询
        PageInfo<Emp> pageInfo = new PageInfo<>(empList);
        // 4.返回结果
        return new PageResult<>(pageInfo.getTotal(), pageInfo.getList());
    }

    /**
     * 根据id查询员工
     *
     * @param id
     * @return
     */
    @Override
    public Emp queryEmpById(String id) {
        Emp emp = empMapper.queryEmpById(id);
        List<EmpExpr> exprList = empExprMapper.queryEmpExprById(id);
        emp.setExprList(exprList);
        return emp;
    }

    /**
     * 批量删除员工
     *
     * @param ids
     */
    @Override
    public void delEmpByIds(List<Integer> ids) {
        // 1.删除员工信息
        empMapper.delEmpByIds(ids);
        // 2.删除员工经历
        empExprMapper.delEmpExprByIds(ids);
    }

    /**
     * 新增员工
     *
     * @param emp
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void addEmp(Emp emp) {
        // 1.新增员工信息
        emp.setPassword("123456");
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.addEmp(emp);
        List<EmpExpr> exprList = emp.getExprList();
        // 2.根据id增加员工经历
        // 2.1判断员工经历是否为空
        if (exprList != null && exprList.size() > 0) {
            for (EmpExpr empExpr : exprList) {
                empExpr.setEmpId(emp.getId());
            }
            // 2.2 新增员工经历
            empExprMapper.addEmpExpr(exprList);
        }
    }

    /**
     * 修改员工
     *
     * @param emp
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateEmp(Emp emp) {
        // 1.修改员工的信息
        empMapper.updateEmp(emp);
        // 2.根据id删除把员工经历全部删除
        Integer id = emp.getId();
        empExprMapper.delEmpExprByIds(Arrays.asList(id));
        // 3.根据id增加员工经历
        List<EmpExpr> exprList = emp.getExprList();
        if (exprList!=null && exprList.size()>0){
            for (EmpExpr empExpr : exprList) {
                empExpr.setEmpId(emp.getId());
            }
            empExprMapper.addEmpExpr(exprList);
        }

    }

    /**
     * 查询员工列表
     *
     * @return
     */
    @Override
    public List<Emp> queryEmpList() {
        return empMapper.queryEmpList();
    }

    /**
     * 统计各个职位的人数
     *
     * @return
     */
    @Override
    public JobOption getEmpJobData() {
        List<Map<String,Object>> mapList = empMapper.getEmpJobData();
        List<Object> jobList = mapList.stream().map(dataList -> dataList.get("jobName")).toList();
        List<Object> totalList = mapList.stream().map(dataList -> dataList.get("total")).toList();
        return new JobOption(jobList,totalList);
    }

    /**
     * 统计员工各个性别人数
     *
     * @return
     */
    @Override
    public List<Map> getEmpGenderData() {
        return empMapper.getEmpGenderData();
    }

    /**
     * 用户登录
     *
     * @param loginDto
     * @return
     */
    @Override
    public LoginInfo login(LoginDto loginDto) {
       LoginInfo loginInfo = empMapper.findByUsernameAndPassword(loginDto);
       // 创建集合 将用户封装到其中
       Map<String,Object> claims = new HashMap<>();
       claims.put("id",loginInfo.getId());
       claims.put("username",loginInfo.getUsername());
       // 获取令牌
       String jwt = JwtUtils.generateJwt(claims);
       // 赋值令牌
       loginInfo.setToken(jwt);
       return loginInfo;
    }
}
